package mx.com.asteca.fachada.impl;


import java.util.ArrayList;
import java.util.List;

import mx.com.asteca.comun.Constantes;
import mx.com.asteca.comun.dto.AdministracionConfigDTO;
import mx.com.asteca.comun.dto.DocumentoDTO;
import mx.com.asteca.comun.dto.PersonaDTO;
import mx.com.asteca.fachada.FachadaException;
import mx.com.asteca.fachada.PersonaFachada;
import mx.com.asteca.servicio.AdministracionConfigService;
import mx.com.asteca.servicio.BaseService;
import mx.com.asteca.servicio.PersonaServicio;
import mx.com.asteca.servicio.ServicioException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class PersonaFachadaImpl extends BaseFachadaImpl<PersonaDTO, Integer>
		implements PersonaFachada {
	
	@Autowired
	private PersonaServicio personaServicio;
	@Autowired
	private AdministracionConfigService adminConfigService;
	
	@Override
	public void desbloqueaUsuario(int idPersona) throws FachadaException{
		try{
			personaServicio.desbloqueadUsuario(idPersona);
		}catch(ServicioException e){
			throw new FachadaException("Error en desbloqueaUsuario:"+e.getMessage(), e);
		}
	}
	
	@Override
	public List<PersonaDTO> findBloqueados() throws FachadaException{
		try{
			List<PersonaDTO> list = personaServicio.findBloqueados();
			return list;
		}catch(ServicioException e){
			throw new FachadaException("Error en findBloqueados:"+e.getMessage(), e);
		}
	}
	
	@Override
	public void aumentaContadorYBloquea(int idPersona) throws FachadaException{
		try{
			AdministracionConfigDTO config = adminConfigService.getAll().get(0);
			int maxContador = config.getNoIntentos();
			int contador = personaServicio.aumentaContador(idPersona);
			if(config.getBloquear() == 1){
				if(maxContador <= contador){
					personaServicio.bloqueaUsuario(idPersona);
				}
			}
		}catch(ServicioException e){
			throw new FachadaException("Error en aumentaContadorYBloquea:"+e.getMessage(), e);
		}
	}

	@Override
	public List<PersonaDTO> getUsuariosConRoles() throws FachadaException{
		List<PersonaDTO> listaInicial = super.getAll();
		List<PersonaDTO> listaFinal = new ArrayList<PersonaDTO>();
		for(PersonaDTO dto : listaInicial){
			if(isAdmin(dto.getIdPersona())){
				dto.setRolNombre(Constantes.ROL_NOMBRE_ADMIN);
			}else if(isAlumno(dto.getIdPersona())){
				dto.setRolNombre(Constantes.ROL_NOMBRE_ALUMNO);
			}else if(isContacto(dto.getIdPersona())){
				dto.setRolNombre(Constantes.ROL_NOMBRE_CONTACTO);
			}else if(isInstructor(dto.getIdPersona())){
				dto.setRolNombre(Constantes.ROL_NOMBRE_INSTRUCTOR);
			}else if(isReferencia(dto.getIdPersona())){
				dto.setRolNombre(Constantes.ROL_NOMBRE_REFERENCIA);
			}else{
				dto.setRolNombre("");
			}
			listaFinal.add(dto);
		}
		return listaFinal;
	}
	
	@Override
	public List<DocumentoDTO> getDocumentosByAlumno(int idPersona) throws FachadaException{
		try{
			List<DocumentoDTO> listaDocs = personaServicio.getDocumentosByAlumno(idPersona);
			return listaDocs;
		}catch(ServicioException e){
			throw new FachadaException("Error en getDocumentosByAlumno:"+e.getMessage(), e);
		}
	}
	
	@Override
	public List<DocumentoDTO> getDocumentosByInstructor(int idPersona) throws FachadaException{
		try{
			List<DocumentoDTO> listaDocs = personaServicio.getDocumentosByInstructor(idPersona);
			return listaDocs;
		}catch(ServicioException e){
			throw new FachadaException("Error en getDocumentosByAlumno:"+e.getMessage(), e);
		}
	}
	
	@Override
	public PersonaDTO getUser(String user) throws FachadaException {
		try {
			PersonaDTO persona = personaServicio.findByUserName(user);
			
			return persona;
		} catch (ServicioException e) {
			throw new FachadaException("Excepcion obteniendo usuario",e);
		}
	}

	@Override
	BaseService getBaseService() {
		return personaServicio;
	}
	
	@Override
	public boolean isAlumno(int idPersona) throws FachadaException{
		try{
			boolean isAlumno = personaServicio.isAlumno(idPersona);
			return isAlumno;
		}catch(ServicioException e){
			throw new FachadaException("Error en isAlumno:"+e.getMessage(), e);
		}
	}
	
	@Override
	public int getIdAlumno(int idPersona) throws FachadaException{
		try{
			int idAlumno = personaServicio.getIdAlumno(idPersona);
			return idAlumno;
		}catch(ServicioException e){
			throw new FachadaException("Error en getIdAlumno:"+e.getMessage(), e);
		}
	}
	
	@Override
	public boolean isAdmin(int idPersona) throws FachadaException{
		try{
			boolean isAdmin = personaServicio.isAdmin(idPersona);
			return isAdmin;
		}catch(ServicioException e){
			throw new FachadaException("Error en isAdmin:"+e.getMessage(), e);
		}
	}
	
	@Override
	public boolean isInstructor(int idPersona) throws FachadaException{
		try{
			boolean isInstructor = personaServicio.isInstructor(idPersona);
			return isInstructor;
		}catch(ServicioException e){
			throw new FachadaException("Error en isInstructor:"+e.getMessage(), e);
		}
	}
	
	@Override
	public int getIdInstructor(int idPersona) throws FachadaException{
		try{
			int idAlumno = personaServicio.getIdInstructor(idPersona);
			return idAlumno;
		}catch(ServicioException e){
			throw new FachadaException("Error en getIdInstructor:"+e.getMessage(), e);
		}
	}

	@Override
	public boolean isReferencia(int idPersona) throws FachadaException{
		try{
			boolean isInstructor = personaServicio.isReferencia(idPersona);
			return isInstructor;
		}catch(ServicioException e){
			throw new FachadaException("Error en isReferencia:"+e.getMessage(), e);
		}
	}
	
	@Override
	public boolean isContacto(int idPersona) throws FachadaException{
		try{
			boolean isInstructor = personaServicio.isContacto(idPersona);
			return isInstructor;
		}catch(ServicioException e){
			throw new FachadaException("Error en isContacto:"+e.getMessage(), e);
		}
	}
	
}
